package d2_final_exam.d5_fifth_question;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    //2、首先是做长连接,管道要一致挂着,全局化------>用对象做
    private Socket socket;
    private Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        //目标: 客户端与服务端的通信, 然后将用户输出的用户名与密码进行存储
        //很懵的时候,就直接能写什么就写什么
        try {
            //3、上來就new 一个本类的对象\
            Client client = new Client();
            //4、将使用管道的方法,丢到实例方法去
            client.start();
        } catch (Exception e) {
            e.printStackTrace();//打印堆栈的信息
        }
    }

    private void start() throws Exception {
        //5、一上来就需要于客户端进行连接诶
        //以上就集中往上抛,抛到最上层集中处理
        socket = new Socket("127.0.0.1", 8118);//会在这等待着管道打通
        System.out.println("连接服务端成功~~~~");

        while (true) {
            //1、开发一个界面

            //2、提示功能
            System.out.println("请输入操作命令");
            System.out.println("1.注册");
            System.out.println("2.登录");
            System.out.println("请选择");
            //3、开始接收用户输出的数据
            String command = sc.next();

            //4、开始switch进行执行哪一个步骤
            switch (command) {
                case "1":
                    //注册
                    register();
                    break;
                case "2":
                    //登录
                    login();
                    break;
                case "exit":
                    //退出
                    System.out.println("退出系统成功");
                    break;
            }
        }

    }

    /**
     * 实现登录的功能
     */
    private void login() throws Exception {
        //提示当前是什么功能
        System.out.println("===============登录==============");
        //1、首先还是提示用户进行输出,账号和密码
        System.out.println("请输出您的账号");
        //开始接收账号
        String username = sc.next();
        System.out.println("请输出您的密码");
        //开始接收
        String password = sc.next();
        //2、开始获取管道
        //有异常还是进行抛出去
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        //登录信息标志
        dos.writeInt(2);
        //3、开始往客户端进行接受数据
        //调用方法进行写数据出去
        dos.writeUTF(username);
        dos.writeUTF(password);
        //4、然后进行刷新管道
        dos.flush();//防止,数据在缓冲区,没有及时写出去

        //5、开始接收服务端的的反馈 --> 首先获取一个socket对象的输入流
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        //1.然后进行等待,服务端进行回复
        System.out.println(dis.readUTF());//进行输出展示


    }

    /**
     * 实现注册的功能
     */
    private void register() throws Exception {
        //注释当前是什么功能
        System.out.println("====================注册====================");
        //2.首先提示用户输出 -----> 注意: 又要使用到扫描器 --> 也将扫描器全局化
        System.out.println("请您数入用户名");
        String username = sc.next();

        System.out.println("请您输出密码");
        String password = sc.next();

        //3、然后向服务端发送送输出,需要用socket获取输出管道
        //  低级管道包装成高级的特殊数据输出流管道 ------------------ > 异常还是往外抛
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        //写一个信息标志过去判断,当前收到的是登录还是注册
        dos.writeInt(1);//证明当前是注册
        //调用方法进行写数据出去
        dos.writeUTF(username);
        dos.writeUTF(password);
        //4、然后进行刷新管道
        dos.flush();//防止,数据在缓冲区,没有及时写出去

        //5、开始接收服务端的的反馈 --> 首先获取一个socket对象的输入流
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        //1.然后进行等待,服务端进行回复
        System.out.println(dis.readUTF());//进行输出展示
    }
}
